package j.quartz.core.common.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;

@SuppressWarnings("all")
public class JSONUtil {

	
	 /**
     * xml String TO  com.alibaba.fastjson.JSONObject
     */
	public static JSONObject xml2JSONObject(String xml) throws DocumentException {
		return elementToJSONObject(strToDocument(xml).getRootElement());
	}
	
	/**
	 * 实体对象ListJson TO List<Map>
	 */
	public static List<Map<String, Object>> parseMapList(String objListJson) {
		List<Map<String, Object>> listMap = 
    			JSON.parseObject(objListJson, new TypeReference<List<Map<String,Object>>>(){});
		return listMap ;
	}
	
	/**
	 * 实体对象 TO Map
	 */
	public static Map<String, Object> parseMap(String objJson) {
		Map<String, Object> map = 
				JSON.parseObject(objJson, new TypeReference<Map<String,Object>>(){});
		return map ;
	}
	
	/**
	 * 属性Map TO obj
	 * @param <T>
	 */
	public static <T> T parseMap2Obj(Map<String,Object> map,Class<T> clazz) {
		String json = JSON.toJSONString(map);
    	return JSON.parseObject(json,clazz);
	}
	
	/**
	 * List<Map> TO 对象List
	 */
	public static <T> List parseMapList2ObjList(List<Map<String, Object>> mapList,Class<T> clazz) {
		List list = new ArrayList();
		for(Map<String,Object> map: mapList) {
	    	list.add(parseMap2Obj(map,clazz)) ;
		}
		return list ;
	} 
	
	
	/**
	 * 对象List TO JSONArray
	 * @param <T>
	 */
	public static <T> JSONArray parseObjList2JSONArray(List<T> list) {
		return JSONArray.parseArray(JSON.toJSONString(list));
	}
	
	/**
	 * JSONArray TO 对象List
	 */
	public static <T> List parseObjList2JSONArray(JSONArray jsonArr,Class<T> clazz) {
		List list = new ArrayList();
		for(int i=0;i<jsonArr.size();i++) {
			JSONObject json = jsonArr.getJSONObject(i) ;
			T obj = JSON.parseObject(json.toJSONString(), clazz);
			list.add(obj) ;
		}
		return list; 
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	/**
     * String 转 org.dom4j.Document
     */
	public static Document strToDocument(String xml) throws DocumentException {
		return DocumentHelper.parseText(xml);
	}

	/**
     * org.dom4j.Element 转  com.alibaba.fastjson.JSONObject
     */
    public static JSONObject elementToJSONObject(Element node) {
        JSONObject result = new JSONObject();
        // 当前节点的名称、文本内容和属性
        List<Attribute> listAttr = node.attributes();// 当前节点的所有属性的list
        for (Attribute attr : listAttr) {// 遍历当前节点的所有属性
            result.put(attr.getName(), attr.getValue());
        }
        // 递归遍历当前节点所有的子节点
		List<Element> listElement = node.elements();// 所有一级子节点的list
        if (!listElement.isEmpty()) {
            for (Element e : listElement) {// 遍历所有一级子节点
                if (e.attributes().isEmpty() && e.elements().isEmpty()) // 判断一级节点是否有属性和子节点
                    result.put(e.getName(), e.getTextTrim());// 沒有则将当前节点作为上级节点的属性对待
                else {
                    if (!result.containsKey(e.getName())) // 判断父节点是否存在该一级节点名称的属性
                        result.put(e.getName(), new JSONArray());// 没有则创建
                    ((JSONArray) result.get(e.getName())).add(elementToJSONObject(e));// 将该一级节点放入该节点名称的属性对应的值中
                }
            }
        }
        return result;
    }
    
   
    
    

}
